package com.thghh.ch6.graph;

import java.util.Iterator;

/**
 * @author Zhikang.Peng
 * @version 1.0
 * @email thghh@qq.com
 * @date 2020/11/13 9:59
 */
public interface IVertex<T> {

    /**
     * 取得顶点的标识
     *
     * @return
     */
    T getLabel();

    /**
     * 标记该顶点已经被访问
     */
    void visit();

    /**
     * 标记顶点尚未访问
     */
    void unVisit();

    /**
     * 判断顶点是否被访问
     *
     * @return
     */
    boolean isVisited();

    /**
     * 用加权边连接该顶点与指定顶点
     *
     * @param vertex 图中作为这条边终点的顶点
     * @param weight 实数值的边权值,如果有的话
     * @return 连接成功返回true
     */
    boolean connect(IVertex<T> vertex, double weight);

    /**
     * 连接该顶点与指定顶点
     *
     * @param vertex 图中作为这条边终点的顶点
     * @return 连接成功返回true
     */
    boolean connect(IVertex<T> vertex);

    /**
     * 创建一个遍历器遍历从该顶点开始的所有边
     *
     * @return 从该顶点开始的边对象的迭代器
     */
    Iterator<IVertex<T>> getNeighborsIterator();

    /**
     * 创建一个迭代器,计算从该顶点到其邻接点的边的权重
     *
     * @return 该顶点的所有邻接点的权重迭代器
     */
    public Iterator getWeightIterator();

    /**
     * 查看顶点是否有邻接点
     *
     * @return
     */
    boolean hasNeighbor();

    /**
     * 取得该顶点一个未访问的邻接点,如果有的话
     *
     * @return
     */
    IVertex<T> getUnvisitedNeighbor();

    /**
     * 记录到该顶点路径上的前一个顶点
     *
     * @param predecessor 前驱
     */
    void setPredecessor(IVertex predecessor);

    /**
     * 取得该顶点路径上的前一个顶点
     *
     * @return
     */
    IVertex<T> getPredecessor();

    /**
     * 检查前一个顶点是否被记录
     *
     * @return
     */
    boolean hasPredecessor();

    /**
     * 设置到该顶点路径的费用
     *
     * @param cost
     */
    void setCost(double cost);

    /**
     * 提取到该顶点路径的费用
     *
     * @return
     */
    double getCost();
}
